/*lic*/
#ifndef __BSP_RTC_INIT_HELPER_H__
#define __BSP_RTC_INIT_HELPER_H__

#include "main.h"
#include <time.h>
#include <stdbool.h>

extern uint8_t time_buf[7];
extern char* build_time_buf[16];

//RTC Config
void App_RTCCfg(void);

// 内部RTC中断
void INT_SRC_RTC_PRD_IrqCallback(void);
// 内部RTC闹钟中断。每天0点启动
void INT_SRC_RTC_ALM_IrqCallback(void);
// 秒中断输入
void INT_SRC_PORT_EIRQ8_IrqCallback(void);

// 临时时间数据结构体
typedef struct __Tag_Tmp_Time_Info_Def {
	uint8_t year_bcd;
	uint8_t mon_bcd;
	uint8_t day_bcd;
	uint8_t week_bcd;
	uint8_t hour_bcd; // 这里要24小时制
	uint8_t min_bcd;
	uint8_t sec_bcd;
	bool update_finished;
}Tmp_Time_Info_Def;
// 临时时间数据结构体

// 时间结构体
typedef struct __Tag_Time_Info_Def {
	char name[16];
	struct tm time_info;
	uint16_t millisecond; // 毫秒
	char iso_time_str[32];
	bool week_update;
	Tmp_Time_Info_Def tmp_time_info;
	struct rt_mutex rtc_lock; // 资源锁，防止资源被使用中修改
	rt_err_t (*Build_Rtc_Time_Str)(struct __Tag_Time_Info_Def* obj);
	rt_err_t (*Update_Time_From_Innner_Rtc_Delay)(struct __Tag_Time_Info_Def* obj);
	rt_err_t (*Update_Time_To_Innner_Rtc_Delay)(struct __Tag_Time_Info_Def* obj);
	rt_err_t (*Flash_Tmp_To_Time)(struct __Tag_Time_Info_Def* obj);
	rt_err_t (*Get_Time_Str_Safe)(struct __Tag_Time_Info_Def *obj, char* str_buf);
	char* (*Get_Milsecond_Iso_Str)(struct __Tag_Time_Info_Def *obj);
	// 外部刷新函数，为了克服内部RTC刷新延迟，所以特化的函数，不具备通用性
	rt_err_t (*Ext_Rtc_Flash_Inner_Rtc_And_Tm_Time_Info)(struct __Tag_Time_Info_Def *obj);
} Time_Info_Def;

extern Time_Info_Def sys_time_info;
// 时间结构体

// 构建iso时间字符串
rt_err_t Build_Rtc_Time_Str_Interface(Time_Info_Def *obj);
// 从内部RTC读取时间。延迟大概2秒
rt_err_t Update_Time_From_Innner_Rtc_Delay_Interface(Time_Info_Def *obj);
// 将时间写入内部RTC。延迟大概2秒。但是读入因为先延迟所以其实没啥影响。
rt_err_t Update_Time_To_Innner_Rtc_Delay_Interface(Time_Info_Def *obj);
// 将临时缓冲区的数据刷新进入时间结构体
rt_err_t Flash_Tmp_To_Time_Interface(Time_Info_Def* obj);
// 获取时间字符串时刷新毫秒
char* Get_Milsecond_Iso_Str_Initerface(Time_Info_Def *obj);

rt_err_t Get_Time_Str_Safe_Interface(Time_Info_Def *obj, char* str_buf);
// 无延迟的将外部RTC刷入内部RTC刷新时间
rt_err_t Ext_Rtc_Flash_Inner_Rtc_And_Tm_Time_Info_Interface(struct __Tag_Time_Info_Def *obj);

rt_err_t Init_Time_Info_Obj(Time_Info_Def *obj, char* name);

#endif /* __BSP_RTC_INIT_HELPER_H__ */

/*eof*/
